{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6bYaCABobL5q"
      },
      "source": [
        "##### Copyright 2018 The TensorFlow Authors."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "FlUw7tSKbtg4"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "08OTcmxgqkc2"
      },
      "source": [
        "# Автоматическое обновление кода до TensorFlow 2\n",
        "\n",
        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://www.tensorflow.org/guide/upgrade\">\n",
        "    <img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />\n",
        "    Смотрите на TensorFlow.org</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs-l10n/blob/master/site/ru/guide/upgrade.ipynb\">\n",
        "    <img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />\n",
        "    Запустите в Google Colab</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://github.com/tensorflow/docs-l10n/blob/master/site/ru/guide/upgrade.ipynb\">\n",
        "    <img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />\n",
        "    Изучайте код на GitHub</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://storage.googleapis.com/tensorflow_docs/docs-l10n/site/ru/guide/upgrade.ipynb\">\n",
        "    <img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />\n",
        "    Скачайте ноутбук</a>\n",
        "  </td>\n",
        "</table>\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fj66ZXAzrJC2"
      },
      "source": [
        "Note: Вся информация в этом разделе переведена с помощью русскоговорящего Tensorflow сообщества на общественных началах. Поскольку этот перевод не является официальным, мы не гарантируем что он на 100% аккуратен и соответствует [официальной документации на английском языке](https://www.tensorflow.org/?hl=en). Если у вас есть предложение как исправить этот перевод, мы будем очень рады увидеть pull request в [tensorflow/docs](https://github.com/tensorflow/docs) репозиторий GitHub. Если вы хотите помочь сделать документацию по Tensorflow лучше (сделать сам перевод или проверить перевод подготовленный кем-то другим), напишите нам на [docs-ru@tensorflow.org list](https://groups.google.com/a/tensorflow.org/forum/#!forum/docs-ru)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hZSaRPoybOp5"
      },
      "source": [
        "TensorFlow 2.0 включает много изменений API, таких как изменение порядка аргументов, переименование символов и изменение значений по умолчанию для параметров. Ручное исправление всех этих модификаций утомительно и подвержено ошибкам. Чтобы упростить изменения и сделать ваш переход на TF 2.0 как можно более плавным, команда TensorFlow создала утилиту `tf_upgrade_v2`, помогающую перейти от legacy кода к новому API.\n",
        "\n",
        "Примечание: `tf_upgrade_v2` устанавливается автоматически для TensorFlow 1.13 и более поздних версий (включая все сборки TF 2.0).\n",
        "\n",
        "Типичное использование выглядит так:\n",
        "\n",
        "<pre class=\"devsite-terminal devsite-click-to-copy prettyprint lang-bsh\">\n",
        "tf_upgrade_v2 \\\n",
        "  --intree my_project/ \\\n",
        "  --outtree my_project_v2/ \\\n",
        "  --reportfile report.txt\n",
        "</pre>\n",
        "\n",
        "Это ускорит процесс обновления за счет конвертации существующих скриптов TensorFlow 1.x Python в TensorFlow 2.0.\n",
        "\n",
        "Скрипт конвертации максимально автоматизирует процесс, но все еще существуют синтаксические и стилистические изменения, которые не могут быть выполнены скриптом."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gP9v2vgptdfi"
      },
      "source": [
        "## Модули совместимости\n",
        "\n",
        "Некоторые символы API не могут быть обновлены просто с использованием замены строк. Чтобы гарантировать поддержку вашего кода в TensorFlow 2.0, скрипт обновления включает в себя модуль `compat.v1`. Этот модуль заменяет символы TF 1.x, такие как `tf.foo`, на эквивалентную ссылку` tf.compat.v1.foo`. Хотя модуль совместимости хорош, мы рекомендуем вам вручную вычитать замены и перенести их на новые API в пространстве имен `tf. *` вместо пространства имен `tf.compat.v1` как можно быстрее.\n",
        "\n",
        "Из-за удаления некоторых модулей из TensorFlow 2.x (например, `tf.flags` и` tf.contrib`) некоторые изменения не могут быть обойдены путем переключения на `compat.v1`. Обновление этого кода может потребовать использования дополнительной библиотеки (например, [`absl.flags`](https://github.com/abseil/abseil-py)) или переключения на пакет в [tenorflow / addons](http://www.github.com/tensorflow/addons).\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "s78bbfjkXYb7"
      },
      "source": [
        "## Рекомендуемый процесс обновления\n",
        "\n",
        "Оставшаяся часть руководства демонстрирует использование скрипта обновления. Хоть скрипт обновления прост в использовании, очень рекомендуем вам использовать скрипт как часть следующего процесса: \n",
        "\n",
        "1. **Модульное тестирование**: убедитесь, что в обновляемом коде имеется набор модульных тестов с разумным охватом. Это код Python, поэтому язык не защитит вас от многих классов ошибок. Также убедитесь, что все ваши зависимости были обновлены до совместимых с TensorFlow 2.0. \n",
        "\n",
        "1. **Установите TensorFlow 1.14**: Обновите ваш TensorFlow до последней версии TensorFlow 1.x, как минимум 1.14. Она включает финальный API TensorFlow 2.0 в `tf.compat.v2`.\n",
        "\n",
        "1. **Протестируйте с 1.14**: Убедитесь, что ваши модульные тесты проходят на этом этапе. Вы будете повторно запускать их в процессе обновления поэтому важно начать с зеленого цвета.\n",
        "\n",
        "1. **Запустите скрипт обновления**: Запустите `tf_upgrade_v2` на всем дереве исходного кода включая тесты. Это обновит ваш код до формата в котором он использует только символы доступные в TensorFlow 2.0. Устаревшие символы будут доступны с `tf.compat.v1`. Это впоследствии потребует ручного внимания, но не сразу.\n",
        "\n",
        "1. **Запустите конвертированные тесты с TensorFlow 1.14**: Ваш код должен все еще запускаться правильно в TensorFlow 1.14. Запустите снова модульные тесты. Любая ошибка в ваших тестах на этом этапе значит, что в скрипте обновления есть ошибка. [Сообщите нам пожалуйста об этом](https://github.com/tensorflow/tensorflow/issues).\n",
        "\n",
        "1. **Проверьте отчет обновления на наличие предупреждений и ошибок**: Скрипт пишет файл отчета объясняющий все конвертации которые вам нужно перепроверить, или все действия которые нужно совершить вручную. Например: Любые оставшиеся экземпляры contrib требуют ручного удаления. Пожалуйста, обратитесь к [RFC для получения дополнительных инструкций](https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md). \n",
        "\n",
        "1. **Установите TensorFlow 2.0**: В этом месте переключение на TensorFlow 2.0 должно быть безопасно.\n",
        "\n",
        "1. **Протестируйте с `v1.disable_v2_behavior`**: Перезапустите ваши тесты с  `v1.disable_v2_behavior ()` в основной функции тестов результаты должны быть те же, что и при запуске под 1.14.\n",
        "\n",
        "1. **Включите V2 Behavior**: Сейчас, когда ваши тесты работают с использованием API v2, вы можете начать смотреть включение v2 behavior. В зависимости от того, как написан ваш код, это может потребовать некоторых изменений. См. [Руководство по миграции](migrate.ipynb) для деталей."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6pwSAQEwvscP"
      },
      "source": [
        "## Использование скрипта обновления\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "I9NCvDt5GwX4"
      },
      "source": [
        "### Установка\n",
        "\n",
        "Перед началом убедитесь, что TensorlFlow 2.0 установлен."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "DWVYbvi1WCeY"
      },
      "outputs": [],
      "source": [
        "try:\n",
        "  import tensorflow.compat.v2 as tf\n",
        "except Exception:\n",
        "  pass\n",
        "\n",
        "tf.enable_v2_behavior()\n",
        "\n",
        "print(tf.__version__)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Ycy3B5PNGutU"
      },
      "source": [
        "Склонируйте git репозиторий [tensorflow/models](https://github.com/tensorflow/models) чтобы у вас был какой-нибудь код для проверки:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "jyckoWyAZEhZ"
      },
      "outputs": [],
      "source": [
        "!git clone --branch r1.13.0 --depth 1 https://github.com/tensorflow/models"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wfHOhbkgvrKr"
      },
      "source": [
        "### Прочитайте help\n",
        "\n",
        "Скрипт должен быть установлен с TensorFlow. Здесь встроенная помощь:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "m2GF-tlntqTQ"
      },
      "outputs": [],
      "source": [
        "!tf_upgrade_v2 -h"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "se9Leqjm1CZR"
      },
      "source": [
        "### Пример кода TF1"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "whD5i36s1SuM"
      },
      "source": [
        "Здесь простой скрипт TensorFlow 1.0:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "mhGbYQ9HwbeU"
      },
      "outputs": [],
      "source": [
        "!head -n 65 models/samples/cookbook/regression/custom_regression.py | tail -n 10"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UGO7xSyL89wX"
      },
      "source": [
        "С установленным TensorFlow 2.0 он не запускается:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "TD7fFphX8_qE"
      },
      "outputs": [],
      "source": [
        "!(cd models/samples/cookbook/regression && python custom_regression.py)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iZZHu0H0wLRJ"
      },
      "source": [
        "### Отдельный файл\n",
        "\n",
        "Скрипт обновления может быть запущен на отдельном файле Python:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "xIBZVEjkqkc5"
      },
      "outputs": [],
      "source": [
        "!tf_upgrade_v2 \\\n",
        "  --infile models/samples/cookbook/regression/custom_regression.py \\\n",
        "  --outfile /tmp/custom_regression_v2.py"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "L9X2lxzqqkc9"
      },
      "source": [
        "Скрипт выведет ошибки если не сможет найти исправления для кода. "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "r7zpuE1vWSlL"
      },
      "source": [
        "### Дерево каталогов"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2q7Gtuu8SdIC"
      },
      "source": [
        "Типичные проекты, включая этот простой пример, используют более одного файла. Обычно хочется обновить весь пакет, поэтому скрипт может быть также запущен на дереве каталогов:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "XGqcdkAPqkc-"
      },
      "outputs": [],
      "source": [
        "# обновить файлы .py и скопировать остальные файлы в outtree\n",
        "!tf_upgrade_v2 \\\n",
        "    --intree models/samples/cookbook/regression/ \\\n",
        "    --outtree regression_v2/ \\\n",
        "    --reportfile tree_report.txt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2S4j7sqbSowC"
      },
      "source": [
        "Обратите внимание на одно замечание по поводу функции `dataset.make_one_shot_iterator`.\n",
        "\n",
        "Сейчас скрипт работает с  TensorFlow 2.0:\n",
        "\n",
        "Обратите внимание, что из-за модуля `tf.compat.v1`, сконвертированный скрипт также будет запускаться в TensorFlow 1.14. "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "vh0cmW3y1tX9"
      },
      "outputs": [],
      "source": [
        "!(cd regression_v2 && python custom_regression.py 2>&1) | tail"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4EgZGGkdqkdC"
      },
      "source": [
        "## Детальный отчет\n",
        "\n",
        "Скрипт также публикует подробный список изменений. В этом примере он нашел одну возможно небезопасную трансформацию и добавил предупреждение в начало файла: "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "CtHaZbVaNMGV"
      },
      "outputs": [],
      "source": [
        "!head -n 20 tree_report.txt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1-UIFXP3cFSa"
      },
      "source": [
        "Обратите внимание вновь на одно замечание о `Dataset.make_one_shot_iterator function`."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oxQeYS1TN-jv"
      },
      "source": [
        "В остальных случаях результат объяснит причину для нетривиальных изменений:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "WQs9kEvVN9th"
      },
      "outputs": [],
      "source": [
        "%%writefile dropout.py\n",
        "import tensorflow as tf\n",
        "\n",
        "d = tf.nn.dropout(tf.range(10), 0.2)\n",
        "z = tf.zeros_like(d, optimize=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "7uOkacZsO3XX"
      },
      "outputs": [],
      "source": [
        "!tf_upgrade_v2 \\\n",
        "  --infile dropout.py \\\n",
        "  --outfile dropout_v2.py \\\n",
        "  --reportfile dropout_report.txt > /dev/null"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "m-J82-scPMGl"
      },
      "outputs": [],
      "source": [
        "!cat dropout_report.txt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DOOLN21nTGSS"
      },
      "source": [
        "Вот измененное содержимое файла, обратите внимание, как скрипт добавляет имена аргументов для работы с перемещенными и переименованными аргументами:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "SrYcJk9-TFlU"
      },
      "outputs": [],
      "source": [
        "!cat dropout_v2.py"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wI_sVNp_b4C4"
      },
      "source": [
        "Больший проект может содержать мало ошибок. Например, конвертируеме модель deeplab:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "uzuY-bOvYBS7"
      },
      "outputs": [],
      "source": [
        "!tf_upgrade_v2 \\\n",
        "    --intree models/research/deeplab \\\n",
        "    --outtree deeplab_v2 \\\n",
        "    --reportfile deeplab_report.txt > /dev/null"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FLhw3fm8drae"
      },
      "source": [
        "Это сгенерировало выходные файлы:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "4YYLRxWJdSvQ"
      },
      "outputs": [],
      "source": [
        "!ls deeplab_v2"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qtTC-cAZdEBy"
      },
      "source": [
        "Но там были ошибки. Отчет поможет вам точно определить, что нужно исправить, прежде чем запускать скрипт. Вот первые три ошибки:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "UVTNOohlcyVZ"
      },
      "outputs": [],
      "source": [
        "!cat deeplab_report.txt | grep -i models/research/deeplab | grep -i error | head -n 3"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gGBeDaFVRJ5l"
      },
      "source": [
        "## \"Безопасный\" режим"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BnfCxB7SVtTO"
      },
      "source": [
        "У скрипт конвертации есть также менее инвазивный `БЕЗОПАСНЫЙ` режим который просто меняет импорты для использования модуля `tensorflow.compat.v1`:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "XdaVXCPWQCC5"
      },
      "outputs": [],
      "source": [
        "!cat dropout.py"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "c0tvRJLGRYEb"
      },
      "outputs": [],
      "source": [
        "!tf_upgrade_v2 --mode SAFETY --infile dropout.py --outfile dropout_v2_safe.py > /dev/null"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "91suN2RaRfIV"
      },
      "outputs": [],
      "source": [
        "!cat dropout_v2_safe.py"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EOzTF7xbZqqW"
      },
      "source": [
        "Как вы можете видеть это не обновляет ваш код, но позволяет TensorFlow 1 коду запускаться в TensorFlow 2"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jGfXVApkqkdG"
      },
      "source": [
        "## Предостережения\n",
        "\n",
        "- Не обновляйте части вашего кода вручную перед запуском скрипта. В частности, функции с переупорядоченными аргументами, такие как `tf.argmax` или` tf.batch_to_space`, вынудят скрипт неправильно добавить аргументы ключевых слов, что запутает ваш существующий код.\n",
        "\n",
        "- Скрипт предполагает, что `tensorflow` импортирован с использованием `import tensorflow as tf`.\n",
        "\n",
        "- Скрипт не переупорядочивает аргументы. Вместо этого скрипт добавляет ключевые слова аргументов к функциям у которых аргументы поменяли порядок.\n",
        "\n",
        "- Проверьте [tf2up.ml](http://tf2up.ml) для подходящего инструмента обновления ноутбуков Jupyter\n",
        "  и файлов Python в репозитории GitHub.\n",
        "\n",
        "Чтобы сообщить об ошибках в скрипте обновления или отправить запрос на добавление функции, отправьте сообщение об ошибке на [GitHub](https://github.com/tensorflow/tensorflow/issues). И если вы тестируете TensorFlow 2.0, мы хотим знать об этом! Вступайте в [сообщество тестирования TF 2.0](https://groups.google.com/a/tensorflow.org/forum/#!forum/testing) и отправляйте вопросы и обсуждения на [testing@tensorflow.org](mailto:testing@tensorflow.org)."
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [],
      "name": "upgrade.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
